{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 人人汽车推荐系统调研综述\n",
    "## 这里是一个推荐引擎，使用经典数据集movielens，可以将movies数据替换为人人的车型数据，rating数据替换为从日志系统中收集的所有用户对车的点击次数，浏览时间（权重）。这样可以实现C端对车型的推荐\n",
    "## 架构： \n",
    "### ①日志系统：搜集用户行为提供离线数据  \n",
    "### ②推荐引擎：A:从数据库或者缓存中拿到用户特征向量（浏览记录 收藏记录 购买记录 停留时间）。B：将用户特征向量通过特征-物品矩阵通过各种推荐算法转换为初始推荐物品列表。C：对初始推荐列表过滤、排名（热门程度、新鲜程度、购买过）。 \n",
    "### ③UI展示系统 提供标题、缩略图、推荐理由（有了推荐理由用户才愿意点击）评分 根据用户点击情况或者评分来增删推荐引擎或者调整推荐引擎所占的权重。\n",
    "## 下面是一个初步的推荐算法引擎，只使用了科学计算包numpy和基于numpy的数据处理的包pandas。基于协同过滤算法，后面会考虑使用tensorflow surprise python-recsys等框架提供的SVD、余弦相似度算法和深度学习神经网络开发更多推荐引擎。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>movieId</th>\n",
       "      <th>title</th>\n",
       "      <th>genres</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Toy Story (1995)</td>\n",
       "      <td>Adventure|Animation|Children|Comedy|Fantasy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>Jumanji (1995)</td>\n",
       "      <td>Adventure|Children|Fantasy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>Grumpier Old Men (1995)</td>\n",
       "      <td>Comedy|Romance</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>Waiting to Exhale (1995)</td>\n",
       "      <td>Comedy|Drama|Romance</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>Father of the Bride Part II (1995)</td>\n",
       "      <td>Comedy</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   movieId                               title  \\\n",
       "0        1                    Toy Story (1995)   \n",
       "1        2                      Jumanji (1995)   \n",
       "2        3             Grumpier Old Men (1995)   \n",
       "3        4            Waiting to Exhale (1995)   \n",
       "4        5  Father of the Bride Part II (1995)   \n",
       "\n",
       "                                        genres  \n",
       "0  Adventure|Animation|Children|Comedy|Fantasy  \n",
       "1                   Adventure|Children|Fantasy  \n",
       "2                               Comedy|Romance  \n",
       "3                         Comedy|Drama|Romance  \n",
       "4                                       Comedy  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import os\n",
    "# 使用pandas加载csv数据\n",
    "\n",
    "movies = pd.read_csv(os.path.expanduser(\"~/ml-latest-small/movies.csv\"))\n",
    "ratings = pd.read_csv(os.path.expanduser(\"~/ml-latest-small/ratings.csv\"))\n",
    "# 去掉无用的维度\n",
    "ratings.drop(['timestamp'],axis=1,inplace=True)\n",
    "movies.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userId</th>\n",
       "      <th>movieId</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>31</td>\n",
       "      <td>2.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1029</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>1061</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1129</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1172</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   userId  movieId  rating\n",
       "0       1       31     2.5\n",
       "1       1     1029     3.0\n",
       "2       1     1061     3.0\n",
       "3       1     1129     2.0\n",
       "4       1     1172     4.0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ratings.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 将movieid替换为moviename\n",
    "def replace_name(x):\n",
    "    return movies[movies[\"movieId\"]==x].title.values[0]\n",
    "\n",
    "ratings.movieId = ratings.movieId.map(replace_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userId</th>\n",
       "      <th>movieId</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Dangerous Minds (1995)</td>\n",
       "      <td>2.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>Dumbo (1941)</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>Sleepers (1996)</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>Escape from New York (1981)</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>Cinema Paradiso (Nuovo cinema Paradiso) (1989)</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   userId                                         movieId  rating\n",
       "0       1                          Dangerous Minds (1995)     2.5\n",
       "1       1                                    Dumbo (1941)     3.0\n",
       "2       1                                 Sleepers (1996)     3.0\n",
       "3       1                     Escape from New York (1981)     2.0\n",
       "4       1  Cinema Paradiso (Nuovo cinema Paradiso) (1989)     4.0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ratings.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 建立一个透视表\n",
    "M = ratings.pivot_table(index=['userId'],columns=['movieId'],values='rating')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(671, 9064)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当前维度\n",
    "M.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>movieId</th>\n",
       "      <th>\"Great Performances\" Cats (1998)</th>\n",
       "      <th>$9.99 (2008)</th>\n",
       "      <th>'Hellboy': The Seeds of Creation (2004)</th>\n",
       "      <th>'Neath the Arizona Skies (1934)</th>\n",
       "      <th>'Round Midnight (1986)</th>\n",
       "      <th>'Salem's Lot (2004)</th>\n",
       "      <th>'Til There Was You (1997)</th>\n",
       "      <th>'burbs, The (1989)</th>\n",
       "      <th>'night Mother (1986)</th>\n",
       "      <th>(500) Days of Summer (2009)</th>\n",
       "      <th>...</th>\n",
       "      <th>Zulu (1964)</th>\n",
       "      <th>Zulu (2013)</th>\n",
       "      <th>[REC] (2007)</th>\n",
       "      <th>eXistenZ (1999)</th>\n",
       "      <th>loudQUIETloud: A Film About the Pixies (2006)</th>\n",
       "      <th>xXx (2002)</th>\n",
       "      <th>xXx: State of the Union (2005)</th>\n",
       "      <th>¡Three Amigos! (1986)</th>\n",
       "      <th>À nous la liberté (Freedom for Us) (1931)</th>\n",
       "      <th>İtirazım Var (2014)</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>userId</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>642</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>643</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>644</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>645</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>646</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>647</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>648</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>649</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>650</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>651</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>652</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>653</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>654</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>655</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>656</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>657</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>658</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>659</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>660</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>661</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>662</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>663</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>664</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3.0</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>665</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>666</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>667</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>668</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>669</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>670</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>671</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>671 rows × 9064 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "movieId  \"Great Performances\" Cats (1998)  $9.99 (2008)  \\\n",
       "userId                                                    \n",
       "1                                     NaN           NaN   \n",
       "2                                     NaN           NaN   \n",
       "3                                     NaN           NaN   \n",
       "4                                     NaN           NaN   \n",
       "5                                     NaN           NaN   \n",
       "6                                     NaN           NaN   \n",
       "7                                     NaN           NaN   \n",
       "8                                     NaN           NaN   \n",
       "9                                     NaN           NaN   \n",
       "10                                    NaN           NaN   \n",
       "11                                    NaN           NaN   \n",
       "12                                    NaN           NaN   \n",
       "13                                    NaN           NaN   \n",
       "14                                    NaN           NaN   \n",
       "15                                    NaN           NaN   \n",
       "16                                    NaN           NaN   \n",
       "17                                    NaN           NaN   \n",
       "18                                    NaN           NaN   \n",
       "19                                    NaN           NaN   \n",
       "20                                    NaN           NaN   \n",
       "21                                    NaN           NaN   \n",
       "22                                    NaN           NaN   \n",
       "23                                    NaN           NaN   \n",
       "24                                    NaN           NaN   \n",
       "25                                    NaN           NaN   \n",
       "26                                    NaN           NaN   \n",
       "27                                    NaN           NaN   \n",
       "28                                    NaN           NaN   \n",
       "29                                    NaN           NaN   \n",
       "30                                    NaN           NaN   \n",
       "...                                   ...           ...   \n",
       "642                                   NaN           NaN   \n",
       "643                                   NaN           NaN   \n",
       "644                                   NaN           NaN   \n",
       "645                                   NaN           NaN   \n",
       "646                                   NaN           NaN   \n",
       "647                                   NaN           NaN   \n",
       "648                                   NaN           NaN   \n",
       "649                                   NaN           NaN   \n",
       "650                                   NaN           NaN   \n",
       "651                                   NaN           NaN   \n",
       "652                                   NaN           NaN   \n",
       "653                                   NaN           NaN   \n",
       "654                                   NaN           NaN   \n",
       "655                                   NaN           NaN   \n",
       "656                                   NaN           NaN   \n",
       "657                                   NaN           NaN   \n",
       "658                                   NaN           NaN   \n",
       "659                                   NaN           NaN   \n",
       "660                                   NaN           NaN   \n",
       "661                                   NaN           NaN   \n",
       "662                                   NaN           NaN   \n",
       "663                                   NaN           NaN   \n",
       "664                                   NaN           NaN   \n",
       "665                                   NaN           NaN   \n",
       "666                                   NaN           NaN   \n",
       "667                                   NaN           NaN   \n",
       "668                                   NaN           NaN   \n",
       "669                                   NaN           NaN   \n",
       "670                                   NaN           NaN   \n",
       "671                                   NaN           NaN   \n",
       "\n",
       "movieId  'Hellboy': The Seeds of Creation (2004)  \\\n",
       "userId                                             \n",
       "1                                            NaN   \n",
       "2                                            NaN   \n",
       "3                                            NaN   \n",
       "4                                            NaN   \n",
       "5                                            NaN   \n",
       "6                                            NaN   \n",
       "7                                            NaN   \n",
       "8                                            NaN   \n",
       "9                                            NaN   \n",
       "10                                           NaN   \n",
       "11                                           NaN   \n",
       "12                                           NaN   \n",
       "13                                           NaN   \n",
       "14                                           NaN   \n",
       "15                                           NaN   \n",
       "16                                           NaN   \n",
       "17                                           NaN   \n",
       "18                                           NaN   \n",
       "19                                           NaN   \n",
       "20                                           NaN   \n",
       "21                                           NaN   \n",
       "22                                           NaN   \n",
       "23                                           NaN   \n",
       "24                                           NaN   \n",
       "25                                           NaN   \n",
       "26                                           NaN   \n",
       "27                                           NaN   \n",
       "28                                           NaN   \n",
       "29                                           NaN   \n",
       "30                                           NaN   \n",
       "...                                          ...   \n",
       "642                                          NaN   \n",
       "643                                          NaN   \n",
       "644                                          NaN   \n",
       "645                                          NaN   \n",
       "646                                          NaN   \n",
       "647                                          NaN   \n",
       "648                                          NaN   \n",
       "649                                          NaN   \n",
       "650                                          NaN   \n",
       "651                                          NaN   \n",
       "652                                          NaN   \n",
       "653                                          NaN   \n",
       "654                                          NaN   \n",
       "655                                          NaN   \n",
       "656                                          NaN   \n",
       "657                                          NaN   \n",
       "658                                          NaN   \n",
       "659                                          NaN   \n",
       "660                                          NaN   \n",
       "661                                          NaN   \n",
       "662                                          NaN   \n",
       "663                                          NaN   \n",
       "664                                          NaN   \n",
       "665                                          NaN   \n",
       "666                                          NaN   \n",
       "667                                          NaN   \n",
       "668                                          NaN   \n",
       "669                                          NaN   \n",
       "670                                          NaN   \n",
       "671                                          NaN   \n",
       "\n",
       "movieId  'Neath the Arizona Skies (1934)  'Round Midnight (1986)  \\\n",
       "userId                                                             \n",
       "1                                    NaN                     NaN   \n",
       "2                                    NaN                     NaN   \n",
       "3                                    NaN                     NaN   \n",
       "4                                    NaN                     NaN   \n",
       "5                                    NaN                     NaN   \n",
       "6                                    NaN                     NaN   \n",
       "7                                    NaN                     NaN   \n",
       "8                                    NaN                     NaN   \n",
       "9                                    NaN                     NaN   \n",
       "10                                   NaN                     NaN   \n",
       "11                                   NaN                     NaN   \n",
       "12                                   NaN                     NaN   \n",
       "13                                   NaN                     NaN   \n",
       "14                                   NaN                     NaN   \n",
       "15                                   NaN                     NaN   \n",
       "16                                   NaN                     NaN   \n",
       "17                                   NaN                     NaN   \n",
       "18                                   NaN                     NaN   \n",
       "19                                   NaN                     NaN   \n",
       "20                                   NaN                     NaN   \n",
       "21                                   NaN                     NaN   \n",
       "22                                   NaN                     NaN   \n",
       "23                                   NaN                     NaN   \n",
       "24                                   NaN                     NaN   \n",
       "25                                   NaN                     NaN   \n",
       "26                                   NaN                     NaN   \n",
       "27                                   NaN                     NaN   \n",
       "28                                   NaN                     NaN   \n",
       "29                                   NaN                     NaN   \n",
       "30                                   NaN                     NaN   \n",
       "...                                  ...                     ...   \n",
       "642                                  NaN                     NaN   \n",
       "643                                  NaN                     NaN   \n",
       "644                                  NaN                     NaN   \n",
       "645                                  NaN                     NaN   \n",
       "646                                  NaN                     NaN   \n",
       "647                                  NaN                     NaN   \n",
       "648                                  NaN                     NaN   \n",
       "649                                  NaN                     NaN   \n",
       "650                                  NaN                     NaN   \n",
       "651                                  NaN                     NaN   \n",
       "652                                  NaN                     NaN   \n",
       "653                                  NaN                     NaN   \n",
       "654                                  NaN                     NaN   \n",
       "655                                  NaN                     NaN   \n",
       "656                                  NaN                     NaN   \n",
       "657                                  NaN                     NaN   \n",
       "658                                  NaN                     NaN   \n",
       "659                                  NaN                     NaN   \n",
       "660                                  NaN                     NaN   \n",
       "661                                  NaN                     NaN   \n",
       "662                                  NaN                     NaN   \n",
       "663                                  NaN                     NaN   \n",
       "664                                  NaN                     NaN   \n",
       "665                                  NaN                     NaN   \n",
       "666                                  NaN                     NaN   \n",
       "667                                  NaN                     NaN   \n",
       "668                                  NaN                     NaN   \n",
       "669                                  NaN                     NaN   \n",
       "670                                  NaN                     NaN   \n",
       "671                                  NaN                     NaN   \n",
       "\n",
       "movieId  'Salem's Lot (2004)  'Til There Was You (1997)  'burbs, The (1989)  \\\n",
       "userId                                                                        \n",
       "1                        NaN                        NaN                 NaN   \n",
       "2                        NaN                        NaN                 NaN   \n",
       "3                        NaN                        NaN                 NaN   \n",
       "4                        NaN                        NaN                 NaN   \n",
       "5                        NaN                        NaN                 NaN   \n",
       "6                        NaN                        NaN                 4.0   \n",
       "7                        NaN                        NaN                 NaN   \n",
       "8                        NaN                        NaN                 NaN   \n",
       "9                        NaN                        NaN                 NaN   \n",
       "10                       NaN                        NaN                 NaN   \n",
       "11                       NaN                        NaN                 NaN   \n",
       "12                       NaN                        NaN                 NaN   \n",
       "13                       NaN                        NaN                 NaN   \n",
       "14                       NaN                        NaN                 NaN   \n",
       "15                       NaN                        NaN                 NaN   \n",
       "16                       NaN                        NaN                 NaN   \n",
       "17                       NaN                        NaN                 NaN   \n",
       "18                       NaN                        NaN                 NaN   \n",
       "19                       NaN                        NaN                 NaN   \n",
       "20                       NaN                        NaN                 NaN   \n",
       "21                       NaN                        NaN                 NaN   \n",
       "22                       NaN                        NaN                 NaN   \n",
       "23                       NaN                        NaN                 NaN   \n",
       "24                       NaN                        NaN                 NaN   \n",
       "25                       NaN                        NaN                 NaN   \n",
       "26                       NaN                        NaN                 NaN   \n",
       "27                       NaN                        NaN                 NaN   \n",
       "28                       NaN                        NaN                 NaN   \n",
       "29                       NaN                        NaN                 NaN   \n",
       "30                       NaN                        NaN                 NaN   \n",
       "...                      ...                        ...                 ...   \n",
       "642                      NaN                        NaN                 NaN   \n",
       "643                      NaN                        NaN                 NaN   \n",
       "644                      NaN                        NaN                 NaN   \n",
       "645                      NaN                        NaN                 NaN   \n",
       "646                      NaN                        NaN                 NaN   \n",
       "647                      NaN                        NaN                 NaN   \n",
       "648                      NaN                        NaN                 NaN   \n",
       "649                      NaN                        NaN                 NaN   \n",
       "650                      NaN                        NaN                 NaN   \n",
       "651                      NaN                        NaN                 NaN   \n",
       "652                      NaN                        NaN                 NaN   \n",
       "653                      NaN                        NaN                 NaN   \n",
       "654                      NaN                        NaN                 4.0   \n",
       "655                      NaN                        NaN                 NaN   \n",
       "656                      NaN                        4.0                 NaN   \n",
       "657                      NaN                        NaN                 NaN   \n",
       "658                      NaN                        NaN                 NaN   \n",
       "659                      NaN                        NaN                 NaN   \n",
       "660                      NaN                        NaN                 NaN   \n",
       "661                      NaN                        NaN                 NaN   \n",
       "662                      NaN                        NaN                 NaN   \n",
       "663                      NaN                        NaN                 NaN   \n",
       "664                      NaN                        NaN                 NaN   \n",
       "665                      NaN                        NaN                 NaN   \n",
       "666                      NaN                        NaN                 NaN   \n",
       "667                      NaN                        NaN                 NaN   \n",
       "668                      NaN                        NaN                 NaN   \n",
       "669                      NaN                        NaN                 NaN   \n",
       "670                      NaN                        NaN                 NaN   \n",
       "671                      NaN                        NaN                 NaN   \n",
       "\n",
       "movieId  'night Mother (1986)  (500) Days of Summer (2009)  \\\n",
       "userId                                                       \n",
       "1                         NaN                          NaN   \n",
       "2                         NaN                          NaN   \n",
       "3                         NaN                          NaN   \n",
       "4                         NaN                          NaN   \n",
       "5                         NaN                          NaN   \n",
       "6                         NaN                          NaN   \n",
       "7                         NaN                          NaN   \n",
       "8                         NaN                          NaN   \n",
       "9                         NaN                          NaN   \n",
       "10                        NaN                          NaN   \n",
       "11                        NaN                          NaN   \n",
       "12                        NaN                          NaN   \n",
       "13                        NaN                          4.0   \n",
       "14                        NaN                          NaN   \n",
       "15                        NaN                          NaN   \n",
       "16                        NaN                          NaN   \n",
       "17                        NaN                          NaN   \n",
       "18                        NaN                          NaN   \n",
       "19                        NaN                          NaN   \n",
       "20                        NaN                          NaN   \n",
       "21                        NaN                          NaN   \n",
       "22                        NaN                          NaN   \n",
       "23                        NaN                          NaN   \n",
       "24                        NaN                          NaN   \n",
       "25                        NaN                          NaN   \n",
       "26                        NaN                          NaN   \n",
       "27                        NaN                          NaN   \n",
       "28                        NaN                          NaN   \n",
       "29                        NaN                          NaN   \n",
       "30                        NaN                          NaN   \n",
       "...                       ...                          ...   \n",
       "642                       NaN                          NaN   \n",
       "643                       NaN                          NaN   \n",
       "644                       NaN                          NaN   \n",
       "645                       NaN                          NaN   \n",
       "646                       NaN                          NaN   \n",
       "647                       NaN                          NaN   \n",
       "648                       NaN                          NaN   \n",
       "649                       NaN                          NaN   \n",
       "650                       NaN                          NaN   \n",
       "651                       NaN                          NaN   \n",
       "652                       NaN                          NaN   \n",
       "653                       NaN                          NaN   \n",
       "654                       NaN                          NaN   \n",
       "655                       NaN                          NaN   \n",
       "656                       NaN                          NaN   \n",
       "657                       NaN                          NaN   \n",
       "658                       NaN                          NaN   \n",
       "659                       NaN                          NaN   \n",
       "660                       NaN                          NaN   \n",
       "661                       NaN                          NaN   \n",
       "662                       NaN                          NaN   \n",
       "663                       NaN                          NaN   \n",
       "664                       NaN                          3.0   \n",
       "665                       NaN                          NaN   \n",
       "666                       NaN                          NaN   \n",
       "667                       NaN                          NaN   \n",
       "668                       NaN                          NaN   \n",
       "669                       NaN                          NaN   \n",
       "670                       NaN                          NaN   \n",
       "671                       NaN                          NaN   \n",
       "\n",
       "movieId         ...           Zulu (1964)  Zulu (2013)  [REC] (2007)  \\\n",
       "userId          ...                                                    \n",
       "1               ...                   NaN          NaN           NaN   \n",
       "2               ...                   NaN          NaN           NaN   \n",
       "3               ...                   NaN          NaN           NaN   \n",
       "4               ...                   NaN          NaN           NaN   \n",
       "5               ...                   NaN          NaN           NaN   \n",
       "6               ...                   NaN          NaN           NaN   \n",
       "7               ...                   NaN          NaN           NaN   \n",
       "8               ...                   NaN          NaN           NaN   \n",
       "9               ...                   NaN          NaN           NaN   \n",
       "10              ...                   NaN          NaN           NaN   \n",
       "11              ...                   NaN          NaN           NaN   \n",
       "12              ...                   NaN          NaN           NaN   \n",
       "13              ...                   NaN          NaN           NaN   \n",
       "14              ...                   NaN          NaN           NaN   \n",
       "15              ...                   NaN          NaN           NaN   \n",
       "16              ...                   NaN          NaN           NaN   \n",
       "17              ...                   NaN          NaN           NaN   \n",
       "18              ...                   NaN          NaN           NaN   \n",
       "19              ...                   NaN          NaN           NaN   \n",
       "20              ...                   NaN          NaN           NaN   \n",
       "21              ...                   NaN          NaN           NaN   \n",
       "22              ...                   NaN          NaN           NaN   \n",
       "23              ...                   NaN          NaN           NaN   \n",
       "24              ...                   NaN          NaN           NaN   \n",
       "25              ...                   NaN          NaN           NaN   \n",
       "26              ...                   NaN          NaN           NaN   \n",
       "27              ...                   NaN          NaN           NaN   \n",
       "28              ...                   NaN          NaN           NaN   \n",
       "29              ...                   NaN          NaN           NaN   \n",
       "30              ...                   NaN          NaN           NaN   \n",
       "...             ...                   ...          ...           ...   \n",
       "642             ...                   NaN          NaN           NaN   \n",
       "643             ...                   NaN          NaN           NaN   \n",
       "644             ...                   NaN          NaN           NaN   \n",
       "645             ...                   NaN          NaN           NaN   \n",
       "646             ...                   NaN          NaN           NaN   \n",
       "647             ...                   NaN          NaN           NaN   \n",
       "648             ...                   NaN          NaN           NaN   \n",
       "649             ...                   NaN          NaN           NaN   \n",
       "650             ...                   NaN          NaN           NaN   \n",
       "651             ...                   NaN          NaN           NaN   \n",
       "652             ...                   NaN          NaN           NaN   \n",
       "653             ...                   NaN          NaN           NaN   \n",
       "654             ...                   NaN          NaN           NaN   \n",
       "655             ...                   NaN          NaN           NaN   \n",
       "656             ...                   NaN          NaN           NaN   \n",
       "657             ...                   NaN          NaN           NaN   \n",
       "658             ...                   NaN          NaN           NaN   \n",
       "659             ...                   NaN          NaN           NaN   \n",
       "660             ...                   NaN          NaN           NaN   \n",
       "661             ...                   NaN          NaN           NaN   \n",
       "662             ...                   NaN          NaN           NaN   \n",
       "663             ...                   NaN          NaN           NaN   \n",
       "664             ...                   NaN          NaN           NaN   \n",
       "665             ...                   NaN          NaN           NaN   \n",
       "666             ...                   NaN          NaN           NaN   \n",
       "667             ...                   NaN          NaN           NaN   \n",
       "668             ...                   NaN          NaN           NaN   \n",
       "669             ...                   NaN          NaN           NaN   \n",
       "670             ...                   NaN          NaN           NaN   \n",
       "671             ...                   NaN          NaN           NaN   \n",
       "\n",
       "movieId  eXistenZ (1999)  loudQUIETloud: A Film About the Pixies (2006)  \\\n",
       "userId                                                                    \n",
       "1                    NaN                                            NaN   \n",
       "2                    NaN                                            NaN   \n",
       "3                    NaN                                            NaN   \n",
       "4                    NaN                                            NaN   \n",
       "5                    NaN                                            NaN   \n",
       "6                    NaN                                            NaN   \n",
       "7                    NaN                                            NaN   \n",
       "8                    NaN                                            NaN   \n",
       "9                    NaN                                            NaN   \n",
       "10                   NaN                                            NaN   \n",
       "11                   NaN                                            NaN   \n",
       "12                   NaN                                            NaN   \n",
       "13                   NaN                                            NaN   \n",
       "14                   NaN                                            NaN   \n",
       "15                   3.0                                            NaN   \n",
       "16                   NaN                                            NaN   \n",
       "17                   5.0                                            NaN   \n",
       "18                   NaN                                            NaN   \n",
       "19                   NaN                                            NaN   \n",
       "20                   NaN                                            NaN   \n",
       "21                   NaN                                            NaN   \n",
       "22                   NaN                                            NaN   \n",
       "23                   4.0                                            NaN   \n",
       "24                   NaN                                            NaN   \n",
       "25                   NaN                                            NaN   \n",
       "26                   NaN                                            NaN   \n",
       "27                   NaN                                            NaN   \n",
       "28                   NaN                                            NaN   \n",
       "29                   NaN                                            NaN   \n",
       "30                   NaN                                            NaN   \n",
       "...                  ...                                            ...   \n",
       "642                  NaN                                            NaN   \n",
       "643                  NaN                                            NaN   \n",
       "644                  NaN                                            NaN   \n",
       "645                  NaN                                            NaN   \n",
       "646                  NaN                                            NaN   \n",
       "647                  NaN                                            NaN   \n",
       "648                  NaN                                            NaN   \n",
       "649                  NaN                                            NaN   \n",
       "650                  NaN                                            NaN   \n",
       "651                  NaN                                            NaN   \n",
       "652                  5.0                                            NaN   \n",
       "653                  NaN                                            NaN   \n",
       "654                  NaN                                            NaN   \n",
       "655                  NaN                                            NaN   \n",
       "656                  NaN                                            NaN   \n",
       "657                  NaN                                            NaN   \n",
       "658                  NaN                                            NaN   \n",
       "659                  NaN                                            NaN   \n",
       "660                  NaN                                            NaN   \n",
       "661                  NaN                                            NaN   \n",
       "662                  NaN                                            NaN   \n",
       "663                  NaN                                            NaN   \n",
       "664                  NaN                                            NaN   \n",
       "665                  NaN                                            NaN   \n",
       "666                  NaN                                            NaN   \n",
       "667                  NaN                                            NaN   \n",
       "668                  NaN                                            NaN   \n",
       "669                  NaN                                            NaN   \n",
       "670                  NaN                                            NaN   \n",
       "671                  NaN                                            NaN   \n",
       "\n",
       "movieId  xXx (2002)  xXx: State of the Union (2005)  ¡Three Amigos! (1986)  \\\n",
       "userId                                                                       \n",
       "1               NaN                             NaN                    NaN   \n",
       "2               NaN                             NaN                    NaN   \n",
       "3               NaN                             NaN                    NaN   \n",
       "4               NaN                             NaN                    NaN   \n",
       "5               NaN                             NaN                    NaN   \n",
       "6               NaN                             NaN                    NaN   \n",
       "7               NaN                             NaN                    NaN   \n",
       "8               NaN                             NaN                    NaN   \n",
       "9               NaN                             NaN                    NaN   \n",
       "10              NaN                             NaN                    NaN   \n",
       "11              NaN                             NaN                    NaN   \n",
       "12              NaN                             NaN                    NaN   \n",
       "13              NaN                             NaN                    NaN   \n",
       "14              NaN                             NaN                    NaN   \n",
       "15              1.0                             NaN                    4.0   \n",
       "16              NaN                             NaN                    NaN   \n",
       "17              NaN                             NaN                    NaN   \n",
       "18              NaN                             NaN                    NaN   \n",
       "19              NaN                             NaN                    NaN   \n",
       "20              NaN                             NaN                    NaN   \n",
       "21              NaN                             NaN                    NaN   \n",
       "22              NaN                             NaN                    NaN   \n",
       "23              NaN                             NaN                    NaN   \n",
       "24              NaN                             NaN                    NaN   \n",
       "25              NaN                             NaN                    NaN   \n",
       "26              NaN                             NaN                    NaN   \n",
       "27              NaN                             NaN                    NaN   \n",
       "28              NaN                             NaN                    NaN   \n",
       "29              NaN                             NaN                    NaN   \n",
       "30              NaN                             NaN                    NaN   \n",
       "...             ...                             ...                    ...   \n",
       "642             NaN                             NaN                    NaN   \n",
       "643             NaN                             NaN                    NaN   \n",
       "644             NaN                             NaN                    NaN   \n",
       "645             NaN                             NaN                    NaN   \n",
       "646             NaN                             NaN                    4.0   \n",
       "647             NaN                             NaN                    NaN   \n",
       "648             NaN                             NaN                    NaN   \n",
       "649             NaN                             NaN                    NaN   \n",
       "650             NaN                             NaN                    NaN   \n",
       "651             NaN                             NaN                    NaN   \n",
       "652             NaN                             NaN                    NaN   \n",
       "653             NaN                             NaN                    NaN   \n",
       "654             NaN                             NaN                    4.5   \n",
       "655             NaN                             NaN                    NaN   \n",
       "656             NaN                             NaN                    NaN   \n",
       "657             NaN                             NaN                    NaN   \n",
       "658             NaN                             NaN                    NaN   \n",
       "659             NaN                             NaN                    NaN   \n",
       "660             NaN                             NaN                    NaN   \n",
       "661             NaN                             NaN                    NaN   \n",
       "662             NaN                             NaN                    NaN   \n",
       "663             NaN                             NaN                    NaN   \n",
       "664             NaN                             NaN                    NaN   \n",
       "665             NaN                             NaN                    NaN   \n",
       "666             NaN                             NaN                    NaN   \n",
       "667             NaN                             NaN                    NaN   \n",
       "668             NaN                             NaN                    NaN   \n",
       "669             NaN                             NaN                    NaN   \n",
       "670             NaN                             NaN                    NaN   \n",
       "671             NaN                             NaN                    NaN   \n",
       "\n",
       "movieId  À nous la liberté (Freedom for Us) (1931)  İtirazım Var (2014)  \n",
       "userId                                                                   \n",
       "1                                              NaN                  NaN  \n",
       "2                                              NaN                  NaN  \n",
       "3                                              NaN                  NaN  \n",
       "4                                              NaN                  NaN  \n",
       "5                                              NaN                  NaN  \n",
       "6                                              NaN                  NaN  \n",
       "7                                              NaN                  NaN  \n",
       "8                                              NaN                  NaN  \n",
       "9                                              NaN                  NaN  \n",
       "10                                             NaN                  NaN  \n",
       "11                                             NaN                  NaN  \n",
       "12                                             NaN                  NaN  \n",
       "13                                             NaN                  NaN  \n",
       "14                                             NaN                  NaN  \n",
       "15                                             NaN                  NaN  \n",
       "16                                             NaN                  NaN  \n",
       "17                                             NaN                  NaN  \n",
       "18                                             NaN                  NaN  \n",
       "19                                             NaN                  NaN  \n",
       "20                                             NaN                  NaN  \n",
       "21                                             NaN                  NaN  \n",
       "22                                             NaN                  NaN  \n",
       "23                                             NaN                  NaN  \n",
       "24                                             NaN                  NaN  \n",
       "25                                             NaN                  NaN  \n",
       "26                                             NaN                  NaN  \n",
       "27                                             NaN                  NaN  \n",
       "28                                             NaN                  NaN  \n",
       "29                                             NaN                  NaN  \n",
       "30                                             NaN                  NaN  \n",
       "...                                            ...                  ...  \n",
       "642                                            NaN                  NaN  \n",
       "643                                            NaN                  NaN  \n",
       "644                                            NaN                  NaN  \n",
       "645                                            NaN                  NaN  \n",
       "646                                            NaN                  NaN  \n",
       "647                                            NaN                  NaN  \n",
       "648                                            NaN                  NaN  \n",
       "649                                            NaN                  NaN  \n",
       "650                                            NaN                  NaN  \n",
       "651                                            NaN                  NaN  \n",
       "652                                            NaN                  NaN  \n",
       "653                                            NaN                  NaN  \n",
       "654                                            NaN                  NaN  \n",
       "655                                            NaN                  NaN  \n",
       "656                                            NaN                  NaN  \n",
       "657                                            NaN                  NaN  \n",
       "658                                            NaN                  NaN  \n",
       "659                                            NaN                  NaN  \n",
       "660                                            NaN                  NaN  \n",
       "661                                            NaN                  NaN  \n",
       "662                                            NaN                  NaN  \n",
       "663                                            NaN                  NaN  \n",
       "664                                            NaN                  NaN  \n",
       "665                                            NaN                  NaN  \n",
       "666                                            NaN                  NaN  \n",
       "667                                            NaN                  NaN  \n",
       "668                                            NaN                  NaN  \n",
       "669                                            NaN                  NaN  \n",
       "670                                            NaN                  NaN  \n",
       "671                                            NaN                  NaN  \n",
       "\n",
       "[671 rows x 9064 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# M是一个非常稀疏的透视表\n",
    "M"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  在_产品-产品协同过滤_中的产品之间的相似性值是通过观察所有对两个产品之间的打分的用户来度量的。\n",
    "<img src=\"img/item-item.png\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对于_用户-产品协同过滤_，用户之间的相似性值是通过观察所有同时被两个用户打分的产品来度量的。\n",
    "<img src=\"img/user-item.png\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 核心算法方面使用皮尔逊的R来计算距离\n",
    "### 两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商\n",
    "![image.svg](img/pearson.svg)\n",
    "### 上式定义了总体相关系数，常用希腊小写字母 ρ (rho) 作为代表符号。估算样本的协方差和标准差，可得到样本相关系数(样本皮尔逊系数)，常用英文小写字母 r 代表：\n",
    "![pearson2.svg](img/pearson2.svg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 算法实现\n",
    "def pearson(s1, s2):\n",
    "    s1_c = s1 - s1.mean()\n",
    "    s2_c = s2 - s2.mean()\n",
    "#     print(f\"s1_c={s1_c}\")\n",
    "#     print(f\"s2_c={s2_c}\")\n",
    "    denominator = np.sqrt(np.sum(s1_c ** 2) * np.sum(s2_c ** 2))\n",
    "    if denominator == 0:\n",
    "        return 0\n",
    "    return np.sum(s1_c * s2_c) / denominator"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  算法引擎2可以考虑比较文本相似度的余弦相似性算法，这也是推荐系统常用的算法。其中，打分被看成n维空间中的向量，而相似性是基于这些向量之间的角度进行计算的。可以使用sklearn的pairwise_distances函数来计算余弦相似性。注意，输出范围从0到1，因为打分都是正的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.070185736110215988"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 永不妥协   碟中谍2\n",
    "pearson(M['Erin Brockovich (2000)'],M['Mission: Impossible II (2000)'])\n",
    "# 永不妥协  指环王\n",
    "# pearson(M['Erin Brockovich (2000)'],M['Fingers (1978)'])\n",
    "# 永不妥协 哈利波特与密室\n",
    "# pearson(M['Erin Brockovich (2000)'],M['Harry Potter and the Chamber of Secrets (2002)'])\n",
    "# 哈利波特与密室  哈利波特与阿兹卡班的囚徒\n",
    "# pearson(M['Harry Potter and the Chamber of Secrets (2002)'],M['Harry Potter and the Prisoner of Azkaban (2004)'])\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get_recs(movie_name, M, num):\n",
    "    reviews = []\n",
    "    for title in M.columns:\n",
    "        if title == movie_name:\n",
    "            continue\n",
    "        cor = pearson(M[movie_name], M[title])\n",
    "        if np.isnan(cor):\n",
    "            continue\n",
    "        else:\n",
    "            reviews.append((title, cor))\n",
    "    reviews.sort(key=lambda tup: tup[1], reverse=True)\n",
    "    return reviews[:num]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('Go Fish (1994)', 0.3873045237464075),\n",
       " ('Chasing Amy (1997)', 0.37484047898675804),\n",
       " ('Audrey Rose (1977)', 0.36586597215212963),\n",
       " (\"Razor's Edge, The (1984)\", 0.36586597215212957),\n",
       " ('Trekkies (1997)', 0.35608001316844984),\n",
       " ('Everything Must Go (2010)', 0.34925991438868215),\n",
       " ('Out of Sight (1998)', 0.33809493392702311),\n",
       " ('Haunting, The (1963)', 0.33177831773334998),\n",
       " ('Barefoot in the Park (1967)', 0.33153641267942063),\n",
       " ('Flawless (1999)', 0.32978207127880155)]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# %%time\n",
    "recs = get_recs('Clerks (1994)', M, 10)\n",
    "recs[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('Enron: The Smartest Guys in the Room (2005)', -0.22634116531793105),\n",
       " ('Shot in the Dark, A (1964)', -0.22997876750526428),\n",
       " ('Boyhood (2014)', -0.23082944937869748),\n",
       " ('Reader, The (2008)', -0.23134059588427391),\n",
       " ('Two for the Road (1967)', -0.23590096015604814),\n",
       " ('Catfish (2010)', -0.23715890580986979),\n",
       " ('Fearless (1993)', -0.23958739682108973),\n",
       " ('Lenny (1974)', -0.24222400168825048),\n",
       " ('A Home at the End of the World (2004)', -0.2438543994182934),\n",
       " ('My Winnipeg (2007)', -0.2438543994182934)]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# %%time\n",
    "anti_recs = get_recs('Clerks (1994)', M, 8551)\n",
    "anti_recs[-10:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 初步设想由大数据同学准备好数据之后，搭建服务进行机器学习，针对每一个车型跑一编结果，缓存起来用户浏览时提供。\n",
    "## 但是根据阿里技术专家郑重（卢梭）所说：推荐系统的搭建是个复杂工程，涉及到实时计算、离线计算，以及各种数据采集、流转等，对自建推荐系统来说，1人年是跑不掉的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
